package com.tangtang.gulimall.product.controller;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

//import org.apache.shiro.authz.annotation.RequiresPermissions;
import com.tangtang.gulimall.product.Grops.AddGrops;
import com.tangtang.gulimall.product.Grops.UpdateGrops;
import com.tangtang.gulimall.product.Grops.UpdateStatusGrops;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.tangtang.gulimall.product.entity.BrandEntity;
import com.tangtang.gulimall.product.service.BrandService;
import com.tangtang.common.utils.PageUtils;
import com.tangtang.common.utils.R;

import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;


/**
 * 品牌
 *
 * @author tangtang
 * @email a1104707271@vip.qq.com
 * @date 2020-09-11 15:22:08
 */
@RestController
@RequestMapping("product/brand")
public class BrandController {
    @Autowired
    private BrandService brandService;

    /**
     * 列表
     */
    @RequestMapping("/list")
    //@RequiresPermissions("product:brand:list")
    public R list(@RequestParam Map<String, Object> params){

        //这个是个queryPage是一个指定的map结构,params一开始就是个空
        PageUtils page = brandService.queryPage(params);

        return R.ok().put("page", page);//R可以put多个list，如R.ok().put("list",list).put("list1",list1)
    }


    /**
     * 信息
     */
    @RequestMapping("/info/{brandId}")
    //@RequiresPermissions("product:brand:info")
    public R info(@PathVariable("brandId") Long brandId){
		BrandEntity brand = brandService.getById(brandId);

        return R.ok().put("brand", brand);
    }

    /**
     * 保存，这里也是需要添加校验逻辑的
     * 同时添加了高级的分组校验
     */
    @RequestMapping("/save")
    //@RequiresPermissions("product:brand:save")
    public R save(@Validated(AddGrops.class) @RequestBody BrandEntity brand, HttpServletResponse response){
        System.out.println("获取vue上传的品牌信息："+brand.toString());
		brandService.save(brand);
        return R.ok();
    }

    /**
     * 只进行状态修改（校验id和校验状态）
     * 这里加的是更新状态的值
     */
    @RequestMapping("/updatestatus")
    public R Updatestatus(@Validated(UpdateStatusGrops.class) @Valid @RequestBody BrandEntity brand)
    {
        System.out.println("获取更新状态的值为："+brand.toString());
        //这个模块只校验id值和状态值
        brandService.updateById(brand);
        return R.ok();
    }
    /**
     * 修改(全方位的修改)
     * 当增加了校验异常处理以后，就可以不用绑定BindingResult来处理校验问题，在控制器里面只考虑逻辑处理
     */
    @RequestMapping("/update")
    //@RequiresPermissions("product:brand:update")
    //非分组校验规则 @Valid  @RequestBody BrandEntity brand /*BindingResult result*/
    public R update(@Validated(UpdateGrops.class) @RequestBody BrandEntity brand){
        System.out.println("有请求进入brand进行修改"+brand.toString());
        //如果含有中间表，品牌修改后，中间表，以及中间表绑定的表都需要进行修改
        //原修改单表的方式
        //brandService.updateById(brand);
        brandService.saveall(brand);
        //brandService.updateBatchById(Arrays.asList(brand));
        return R.ok();

        //这些都是没有定义异常处理的，所以需要在这里面处理
        /*Map<String,String> map = new HashMap<>();
        //1.使用箭头符号进行遍历的写法
        if (result.hasErrors()) {
            result.getFieldErrors().forEach((item)->{
                //获取错误属性
                String errorid = item.getField();
                //获取错误消息
                String errormessage = item.getDefaultMessage();
                map.put(errorid,errormessage);
                System.out.println("获取到的错误消息为：");
                System.out.println(errorid+":"+errormessage);
            });
            return R.error().put("data",map);
        }else {
            return R.ok("no error ,you can save").put("data","校验成功");
            //System.out.println("有请求进入brand进行修改"+brand.toString());
            //brandService.updateById(brand);
            //brandService.updateBatchById(Arrays.asList(brand));
        }
        //2.下面是正常的写遍历写法
        //这个list是获取了所有校验的错误(这里别写成getAllError)
        /*List<FieldError> fieldErrorList = result.getFieldErrors();
        //判断，如果发现校验错误
        if(result.hasErrors()){
            System.out.println("是否进入校验需求！");
            for (FieldError error:fieldErrorList) {
                //获取了所有错误属性的名称
                String errorid = error.getField();
                //获取对应属性的错误提示
                String errormessage = error.getDefaultMessage();

                System.out.println("错误提示为：");
                System.out.println(errorid+":"+errormessage);
                //将所有的错误提示都封装到map里面进行消息提示
                map.put(errorid,errormessage);
            }
            return R.error().put("data",map);
        }else{
            return R.ok("no error ,you can save").put("data","校验成功");
            //System.out.println("有请求进入brand进行修改"+brand.toString());
            //brandService.updateById(brand);
            //brandService.updateBatchById(Arrays.asList(brand));
        }*/
    }

    /**
     * 删除
     */
    @RequestMapping("/delete")
    //@RequiresPermissions("product:brand:delete")
    public R delete(@RequestBody Long[] brandIds){
		brandService.removeByIds(Arrays.asList(brandIds));

        return R.ok();
    }
    /**
     * test连接函数
     */
    @RequestMapping("/test")
    public R testconnect()
    {
        System.out.println("有请求进入测试连接需求！");
        return R.ok("testconnect");
    }
}
